Eric,基于多搜索引擎的自动问答机器人
專 欄
Snake,Python中文社区专栏作者
Blog:http://Snakehacker.me
❈ERIC(https://github.com/SnakeHacker/QA-Snake)是一个采用Python编写的基于多搜索引擎和AIML技术的问答机器人,英文名的意思是多才多艺的(这也是我想赋予他的)。目前支持的功能有:闲聊,通用问答等。本文主要讲述我在写Eric的过程中对于问答系统的一些思考与想法,在文末会介绍Eric的使用和展示。
最初接到导师给的研究题目(自动问答)是在2017年4月上旬,然后就在看大牛们写论文(文末给地址),找相关资料以及研究市场上各种现有的商业自动问答产品(中国版的聊天机器人地图 Chatbots Landscape - 知乎专栏)中度过了一个月,这个过程中少不了狂和机器人聊天,测试不同产品对同类问题的反应。
现代的自动问答是将自然语言处理、统计机器学习深度学习相结合的产物。自从1950年代图灵测试而诞生至今,自动问答系统的发展已经有几十年的历 史。但真正在产业界得到大家的广泛关注,则得益于2011年Siri和Watson的成功。这一方面归功于机器学习与自然语言处理技术的快速进步,另一方 面得益于维基百科等大规模知识库以及海量网络信息,也就是大数据的飞速发展。
然而,现有的自动问答系统还不够完美,部分还是基于关键字模版匹配(包括一些商业产品),无法真正做到语义理解的程度。在通用领域实现一个不被大多数人喷的问答系统更是难上加难。事实上,无论是业界应用还是学术研究,问句的真实意图分析、问句与答案之间的匹配关系判别仍然是制约自动问答系统性能的两个关键难题。
几乎所有的问答系统的流程可以归结为以下几部分:
目前的研究工作大多集中于上图的两个虚线框中的内容,有用传统的规则搞的,也有用统计方法搞的,也有用深度学习方法搞的。中文的问答系统,还需要进行分词 等工作。问答系统又不同于聊天机器人(小冰等),它是要解决实际问题的。比如客服问答机器人,阿里和京东的都做得非常不错,这不仅是基于他们强大的研发团 队,足够的数据支撑模型训练也是重要的因素之一。
然而,我就想做个简单的问答机器人,然后顺利毕业啊。没有那么多公开的中文数据,怎么破?学术界的大多方法还不能很好地运用到工业界。看完论文和大 多商业产品后,我开始思考Eric的定位,由于目前中文的问答训练集非常少,并且没有通用的问答训练集,这对于一开始想采用统计机器学习、深度学习训练一 个问答模型的我造成了非常大的困难,这个问题足足困扰了我一周。在不断查找资料的过程中我发现了AIML,非常棒的人工智能标记语言。Alice是一个基于AIML实现关键词匹配和简单的推理的聊天机器人,它的语料库非常之大,不过是英语的((╯﹏╰))。
但不管怎么样这是一种实现问答机器人的方式,于是我先跑通了基于AIML的问答机器人。但是他仅仅是基于关键词匹配和简单的推理,缺少语义理解的能力,虽然它的可扩展性非常强,但是如果只做到这步的话,我想我是没办法顺利毕业了。
在研究AIML的过程中,我发现了互联网上有许多半结构化数据。比如维基百科,百度百科等。我尝试使用AIML把问句转换成一种结构化的 Query,然后再百度百科中找到对应属性的属性值。比如“王思聪的父亲是谁?”这个问题,AIML根据规则会抽取出“王思聪”,“父亲”。抽取出来的实 体和属性是很容易在百度百科中搜索到的。但问题又来了,如果问“王思聪的老爹是?”这类问题,Eric就找不到答案了。为了解决这个问题,我引入了哈工大的同义词词林进行关键词扩展。
做到这步,基本上百度百科上有的答案我都能搜出来了。这还远远不够,对于百度百科没有的答案怎么办呢?有些问题的答案其实已经在搜索引擎的前几十条答案中有,人很容易找出这些答案,但机器怎么找答案呢?
知识图谱是我原本想模仿百度百科做的一个本地知识库,后来发现,要构建这样的通用知识库太麻烦了,工作量非常之大。那么既然百度有了知识图谱,我为 何不去尝试用它,而要重复造轮子呢?同样的道理,本地其实不需要太多的知识,所有的知识搜索引擎几乎都能找到,为何还要耗时费力的去构建本地的知识库呢, 我的知识库就是整个互联网啊。百度没有搜到的东西,Bing有吧,Google有吧?
做到这步Eric的定位就比较清晰了,自动问答的问题也就变成了根据问句从互联网中抽取答案。我还想做闲聊,但是也没训练集。我尝试让两个产品的机器人互聊,借此收集语料,结果他们聊死了。最后在网上找到一个质量一般的聊天对话语料库,暂时凑合着先用。后面有时间再来聊优化闲聊的部分。
我采用BeautifulSoup对百度知道、百度百科、百度搜索、Bing搜索这四个信息源进行了规则解析。这里要提一下百度知道(包括类似的问答社区),在线搜索解析的成本真的比写爬虫把数据抓取并存储成结构化知识要省力得多,现成的知识库要灵活运用起来。
下面是Eric的问句效果,我拿杨尚川老师的“测试人机问答系统智能性的3760个问题”以及自己收集的问题进行了测试,结果还凑合。下面是结果,用Django写了个站进行展示:
Github上放出来的代码提供了支持命令行的问答模块以及基于Socket通信的server端,代码很乱,后续会做进一步改进。
总结:
目前的Eric还很稚嫩,还存在包括但不仅限以下问题:
1.多轮对话能力为零
2.没有情感
3.对于搜索引擎都找不到的答案,没有自己的“思维”抽象能力。
4.问答的结果如何评估?目前都是人在看,对于中文的问答有没有比较好的评估标准和方式?
5.语义相同问法不同的问句返回的答案会不一致,还是没做到语义理解。
后期我将做以下工作:
1. 将CNN问句分类用于Eric,为后续对不同类别的问句做针对性回答策略做铺垫。(目前遇到的问题还是训练集不够,模型用Tensorflow已经搭好了。)
2. 尝试解决语义理解。
3. 问句收集模块的设计与实现。
4. 对于多个候选答案进行打分排序,提出一个打分策略并验证可行性。
欢迎大家踊跃留言,多多指教!
作者留言:2018年硕士毕业,找一份可以在今年9-10月份到岗的实习(工作地点:上海,岗位:自然语言处理、Java开发,其他岗位也可以尝试下,可联系下方微信)
参考:
看过的自动问答相关论文:http://pan.baidu.com/s/1pKKUIfD
杨尚川老师的3760个问题:测试人机问答系统智能性的3760个问题 - 杨尚川的个人页面 - 开源
长按扫描关注Python中文社区,
获取更多技术干货!
Python 中 文 社 区
Python中文开发者的精神家园
合作、投稿请联系微信:
pythonpost
1MEwnaxmMz7BPTYzBdj751DPyHWikNoeFS
本文为作者原创作品,未经作者授权同意禁止转载
点击阅读原文可进入Python圈子获取下方资料:
人工智能与深度学习国内外最新资料、Python web开发、数据分析、网络爬虫学习资料大全、《Python爬虫入门》、《Python简易爬虫实战案例》、《TensorFlow从入门到案例》课件,《Python数据科学入门》案例源代码及各类Python资料、技术源码、行业信息精选定期分享。